/******************************************
Estacionamiento.java
Universidad del Valle de Guatemala
Algoritmos y Estructura de Datos
Autor:
    Martín Guzmán
Fecha: 15 de julio de 2009
Descripción:
*******************************************/
import java.util.ArrayList;
import java.lang.reflect.Array;

public class Estacionamiento<G> {
    private int disponibles;
    private final int max=10;
    private G[] arreglo;

    // método constructor
    public Estacionamiento()
    {
        disponibles=max;
        arreglo= (G[]) new Object[max];
    }

    //método que indica cuántos espacios le quedan disponibles
    public int getDisponibles(){
        return disponibles;
    }

    //método que setea la cantidad de disponibles
    public void setDisponibles(int numero){
        disponibles=numero;
    }

    //método que agrega un elemento a la pila
    public void push(G Elemento_G){

        if(full()!=true)
        {
            arreglo[this.ultima_Posicion()]=Elemento_G;
            disponibles-=1;
        }
    }

    //método que saca el último elemento de la pila
    public G pop(){
        if(disponibles==10){
            //System.out.println("Disculpe, el parqueo está vacío");
            return null;
        }
        else
        {
            G temporal=arreglo[this.ultima_Posicion()-1];
            arreglo[this.ultima_Posicion()-1]=null;
            disponibles+=1;
            return temporal;
        }
    }

    //método para ver el elemento del tope de la pila
    public G peek(){
        if(empty()!=true)
            return arreglo[this.ultima_Posicion()-1];
        return null;
    }

    //método para ver si la pila está vacía
    public boolean empty(){
        boolean vacio=true;
        for(int i=0;i<arreglo.length;i++){
            if(arreglo[i]!=null)
            {
                vacio=false;
                break;
            }
        }
        return vacio;
    }

    //método para ver si la pila está llena
    public boolean full(){
        boolean full=true;
        for(int i=0;i<arreglo.length;i++){
            if(arreglo[i]==null)
            {
                full=false;
                break;
            }
        }
        return full;
    }

    public G[] getArreglo() {
        return arreglo;
    }

    public void setArreglo(G[] arreglo) {
        this.arreglo = arreglo;
    }

    //Devuelve la última posición que tiene un vehículo alamacenado
    public int ultima_Posicion(){
        int posicion=max-disponibles;
        return posicion;
    }

    //toString del la clase
    public String toString(){
        String temporal = "|";
        for(int i=0;i<arreglo.length;i++)
                temporal+= ((arreglo[i]!=null)?"OC":"--")+"|";

        return temporal;
    }

    public int getMax(){
        return max;
    }
}
